#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<algorithm>
#include<functional>
using namespace std;

const int maxn = 510;

int N, M;
vector<int> nextNodes[maxn];
int inDegree[maxn];
vector<int> ans;
int G[maxn][maxn];

void init(){
	for(int i = 1; i <= N; i ++){
		nextNodes[i].clear();
	}
	memset(inDegree, 0, sizeof(char) * maxn);
	ans.clear();
	memset(G, 0, sizeof(int) * maxn * maxn);
}

void solve(){
	priority_queue<int, vector<int>, greater<int> > q;
	for(int i = 1; i <= N; i ++){
		if(inDegree[i] == 0){
			q.push(i);
		}
	}
	
	while(!q.empty()){
		int minNode = q.top();
		q.pop();
		ans.push_back(minNode);
		for(int i = 0; i < nextNodes[minNode].size(); i ++){
			int nextNode = nextNodes[minNode][i];
			inDegree[nextNode] --;
			if(inDegree[nextNode] == 0){
				q.push(nextNode);
			}
		}
	}
}

void printAns(){
	for(int i = 0; i < ans.size(); i ++){
		if(i == 0){
			printf("%d", ans[i]);
		}else{
			printf(" %d", ans[i]);
		}
	}
	printf("\n");
}

int main(void){
	while(scanf("%d%d", &N, &M) == 2){
		init();
		for(int i = 0; i < M; i ++){
			int a, b;
			scanf("%d%d", &a, &b);
			if(G[a][b] == 0){
				G[a][b] = 1;
				nextNodes[a].push_back(b);
				inDegree[b] ++;
			}
		}

		solve();

		printAns();
	}	
}
